/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */
package jp.ize.ux.components;

// {{{ imports
import jp.ize.ux.UXObject;
import jp.ize.ux.UXController;
import jp.ize.ux.UXInteraction;
import jp.ize.ux.UXFocusManager;
import jp.ize.ux.acts.Act;
import jp.ize.ux.acts.VisibilityAct;
import jp.ize.ux.components.UXComponent;
import jp.ize.ux.components.UXComponentResource;
import jp.ize.ux.interactions.UXGeneralInteraction;
import jp.ize.ux.states.UXBasicState;
import jp.ize.ux.events.UXMouseEvent;
import jp.ize.ux.events.UXKeyboardEvent;
import jp.ize.ux.geom.UXPoint;
import jp.ize.ux.tween.easings.Linear;

#if flash9
import flash.ui.Keyboard;
#elseif flash
import flash.Key;
#end
// }}}
// {{{ class UXSceneAct extends VisibilityAct
/**
 * UXSceneAct クラス<br>
 * UXSceneのデフォルトアクションです。
 */
class UXSceneAct extends VisibilityAct
{
	// {{{ public function new()
	/**
	 * コンストラクタです。<br>
	 */
	public function new()
	{
		super();
	}
	// }}}
	// {{{ public function show( time:Float ) : UXSceneState->Void
	/**
	 * 表示された時のデフォルトアクションです。
	 *
	 * @param time: アニメーションを行なう時間を指定します。
	 */
	public function show( time:Float ) : UXSceneState->Void
	{
		var param = {
			time: time,
			transition: Linear.easeIn,
			dir: SHOW,
			blurX: 0.0,
			blurY: 8.0
		}
		var me = this;
		return function (s:UXSceneState) {
			var f = me.fade_and_blur(param);
			f(s);
		}
	}
	// }}}
	// {{{ public function hide( time:Float ) : UXSceneState->Void
	/**
	 * 非表示になった時のデフォルトアクションdす。
	 *
	 * @param time: アニメーションを行なう時間を指定します。
	 */
	public function hide( time:Float ) : UXSceneState->Void
	{
		var param = {
			time: time,
			transition: Linear.easeIn,
			dir: HIDE,
			blurX: 0.0,
			blurY: 8.0
		}
		var me = this;
		return function (s:UXSceneState) {
			var f = me.fade_and_blur(param);
			f(s);
		}
	}
	// }}}
}
// }}}
// {{{ class UXSceneState
/**
 * UXSceneState クラス<br>
 * UXSceneの現在の状態を表すオブジェクトです。
 * UXSceneStateはテキストやアイコンを直線的に配置するため、UXLinearStateを用います。
 */
//class UXSceneState extends UXLinearState
class UXSceneState extends UXBasicState
{
	// {{{ public var manager(default, default) : UXSceneManager
	/**
	 * UXSceneManagerのインスタンスです。
	 */
	public var manager(default, default) : UXSceneManager;
	// }}}
	// {{{ public var formdata(default, default) : UXFormData
	/**
	 * UXFormDataのインスタンスです。
	 */
	public var formdata(default, default) : UXFormData;
	// }}}
	// {{{ public var acts(default, null) : UXSceneAct
	/**
	 * デフォルトの画面の動きです。
	 */
	public var acts(default, null) : UXSceneAct;
	// }}}
	// {{{ public function new( manager:UXSceneManager ) : Void
	/**
	 * コンストラクタです。
	 *
	 * @param manager: マネージャのインスタンスを指定します。
	 */
	public function new( manager:UXSceneManager ) : Void
	{
		super();
		this.manager  = manager;
		this.formdata = new UXFormData();
		this.acts     = new UXSceneAct();
	}
	// }}}
	// {{{ private function attachResource() : Void
	/**
	 * アイテムに対するグローバルなリソースをresourceプロパティに取得する関数です。
	 */
	private function attachResource() : Void
	{
	}
	// }}}
}
// }}}

// {{{ class UXScene extends UXComponent
/**
 * UXScene クラス<br>
 * 画面遷移の中の一つの画面を表現するためのクラスです。<br />
 * 画面遷移の前後でアクションが必要な場合はそれぞれのインタラクションでアクションを追加します。<br />
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id: UXScene.hx 20 2009-02-04 08:23:19Z yimai.v $<br>
 */
class UXScene extends UXComponent<UXSceneState>
{
	// {{{ properties

	public var scenes:Array<UXScene>;

	// }}}
	// {{{ public function new( manager:UXSceneManager )
	/**
	 * コンストラクタです。
	 *
	 * @param manager: マネージャのインスタンスを指定します。
	 */
	public function new( manager:UXSceneManager )
	{
		scenes = new Array();
		// レイアウトとアクトのインスタンスを作ります。
		state = new UXSceneState(manager);
		state.target = this;
		ctrl = new UXController<UXSceneState>( state );
		ctrl.addInteraction( new UXScenePreViewInteraction() );
		ctrl.addInteraction( new UXScenePostViewInteraction() );
		super(ctrl);
		ctrl.getInteraction("PreView").setActSequentialMode(true);
		ctrl.getInteraction("PreView").addAct(state.acts.show(0.2));
		ctrl.getInteraction("PostView").setActSequentialMode(true);
		ctrl.getInteraction("PostView").addAct(state.acts.hide(0.2));
	}
	// }}}
	// {{{ public function refreshResource() : Void
	/**
	 * アイテムに対するグローバルなリソースを再取得する関数です。
	 */
	public function refreshResource() : Void
	{
	}
	// }}}
	// {{{ public function update( updator : UXSceneState -> Void ) : Void
	/**
	 * このコンポーネントの状態を直接変更するメソッドです。状態のどんな操作も可能になるので、
	 * このメソッドの使用には注意が必要です。
	 */
	public function update( updator : UXSceneState -> Void ) : Void
	{
		updator( state );
	}
	// }}}
	// {{{ public function view() : Void
	/**
	* このシーンに遷移されるときにmanagerから呼出されます。
	* このメソッドをオーバーライドして要素の追加、描画等を行ないます。
	*/
	public function view() : Void
	{
	}

	// }}}
	// {{{ public function addUXScene( s:UXScene ) : Void
	/**
	* サブ・シーンを追加する
	*/
	public function addUXScene( s:UXScene ) : Void
	{
		scenes.push(s);
		addUXChild(s);
	}

	// }}}
	// {{{ public function removeUXScene( s:UXScene ) : Void
	/**
	* サブ・シーンを削除する
	*/
	public function removeUXScene( s:UXScene ) : Void
	{
		scenes.remove(s);
		removeUXChild(s);
	}

	// }}}
	// {{{ public function getFormData() : UXFormData
	/**
	* このシーンの持つUXFormDataのインスタンスを取得します。
	*/
	public function getFormData() : UXFormData
	{
		return state.formdata;
	}

	// }}}
	// {{{ public function getFormValues() : Hash<String>
	/**
	* formdataから値を取得します。
	*/
	public function getFormValues() : Hash<String>
	{
		return state.formdata.values;
	}

	// }}}
	// {{{ public function setFormValues( v:Hash<String> ) : Void
	/**
	* formdataに値を設定します。
	*/
	public function setFormValues( v:Hash<String> ) : Void
	{
		state.formdata.values = v;
	}

	// }}}
	// {{{ public function getValue( key:String ) : String
	/**
	* keyを指定して、valuesから値を外部に取得します。
	*/
	public function getValue( key:String ) : String
	{
		return state.formdata.getValue(key);
	}

	// }}}
	// {{{ public function setValue( key:String, val:String ) : Void
	/**
	* keyを指定して、内部のvaluesに値を設定します。
	*/
	public function setValue( key:String, val:String ) : Void
	{
		state.formdata.setValue(key,val);
	}

	// }}}
}
// }}}

// {{{ class UXScenePreViewInteraction extends UXGeneralInteraction<UXSceneState>
/**
 * UXScenePreViewInteraction クラス<br>
 * アイテムの実行に対するデフォルトインタラクションです。
 */
class UXScenePreViewInteraction extends UXGeneralInteraction<UXSceneState>
{
	// {{{ public function new() : Void
	/**
	* コンストラクタ
	*/
	public function new() : Void
	{
		super("PreView");
		this.judge = function(s) {
			return s.enabled;
		}
	}

	// }}}
}
// }}}
// {{{ class UXScenePostViewInteraction extends UXGeneralInteraction<UXSceneState>
/**
 * UXScenePostViewInteraction クラス<br>
 * アイテムの実行に対するデフォルトインタラクションです。
 */
class UXScenePostViewInteraction extends UXGeneralInteraction<UXSceneState>
{
	// {{{ public function new() : Void
	/**
	* コンストラクタ
	*/
	public function new() : Void
	{
		super("PostView");
		this.judge = function(s) {
			return s.enabled;
		}
	}

	// }}}
}
// }}}
